package com.sy.socket.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务器端不需要设置ip地址（默认为本机ip地址）
 */
public class Server {
    public static void main(String[] args) throws IOException {
        // 设置服务器端监听
        ServerSocket serverSocket = new ServerSocket(2000);

        System.out.println("服务器监听准备就绪");
        System.out.println("服务器地址：" + serverSocket.getInetAddress() + "port" + serverSocket.getLocalPort());

        // 等待客户端的连接
        for (;;){
            // 得到客户端
            Socket acceptClient = serverSocket.accept();
            // 客户端构建异步线程
            ClientHandle clientHandle = new ClientHandle(acceptClient);
            // 启动线程
            clientHandle.start();
        }
    }

    /**
     * 因为有多个客户端，所以采用异步多线程来监听
     *
     * 客户端传来的的消息处理
     */
    private static class ClientHandle extends Thread{
        private Socket socket;
        private boolean flag = true;

        ClientHandle(Socket socket){
            this.socket = socket;
        }

        @Override
        public void run() {
            super.run();
            System.out.println("客户端的地址：" + socket.getInetAddress() + "port" + socket.getPort());

            try {
                // 得到打印流，用于数据输出；服务器返回数据
                PrintStream socketOutput = new PrintStream(socket.getOutputStream());
                // 获取输入流，用于接收数据
                BufferedReader socketInput = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()
                ));

                do{
                    // 从客户端读取一条数据
                    String str = socketInput.readLine();
                    // 根据客户端传递过来的消息进行回送
                    if ("bye".equalsIgnoreCase(str)) {
                        flag = false;
                        // 回送
                        socketOutput.println("bye");
                    } else {
                        // 屏幕打印客户端发来的消息
                        System.out.println(str);
                        // 回送数据的长度
                        socketOutput.println("服务器回送：" + str + str.length());
                    }
                } while (flag);

                // 释放资源
                socketInput.close();
                socketOutput.close();

            } catch (Exception e) {
                System.out.println("连接异常断开");
            } finally {
                try {
                    // 出现连接异常的话，和客户端连接的socket关闭
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            System.out.println("客户端退出");
            System.out.println("客户端的地址：" + socket.getInetAddress()
                    + "port" + socket.getPort());

        }
    }

}
